In [ ]:
By: Allyson Lynch
In [1]:
import csv
import urllib.request 
import urllib.error
import urllib.parse
from rdkit import Chem 

Check for error in the creation of the cleaned file of smiles

In [2]:
#check for errors

def check_name(name, return_type="smiles"):
    """takes an amine name and calls a smiles string from cactus"""
    compliant_name = urllib.parse.quote_plus(name)
    url = "https://cactus.nci.nih.gov/chemical/structure/"+name+"/"+return_type
    req = urllib.request.Request(url)
    try: resp = urllib.request.urlopen(req)
    except urllib.error.URLError as e:
        return None
    resp = resp.read().decode(resp.headers.get_content_charset() or 'utf-8') 
    return resp

def error_files(file_name):
    """takes a file of amine names and returns files of amine names that could not be converted through cactus and rdkit"""
    fh = open("Outputs/01x CCDC Clean Check/" + file_name, "r")
    reader = csv.DictReader(fh, delimiter = '\t')
    directory = "Outputs/01x CCDC Clean Check/"
    oh = open(directory + "errors.tsv", "w")
    error_file = csv.writer(oh, delimiter = '\t')
    ok = open(directory + "passed.tsv", "w")
    passed_file = csv.writer(ok, delimiter = '\t')
    am = open(directory + "not_amine.tsv", "w")
    amines_file = csv.writer(am, delimiter = '\t')
    er = open(directory + "rdkit_errors.tsv", "w")
    rdkit_file = csv.writer(er, delimiter = '\t')
    ne = open(directory + "neutralization_errors.tsv", "w")
    neutral_file = csv.writer(ne, delimiter = '\t')
    ct = open(directory + "rdkit_to_cactus.tsv", "w")
    cactus_file = csv.writer(ct, delimiter = '\t')
    previously_found = []
    duplicates_found = 0
    for row in reader:
        amines = eval(row['Amine'])
        for name in amines:
            if name not in previously_found:
                smiles = check_name(name)
                if smiles == None:
                    error_file.writerow(row.values())
                else:
                    previously_found.append(name)
                    passed_file.writerow([name,smiles])
            else:  #name was previously found
                duplicates_found += 1
        if smiles!=None: 
            #neutralization check
            amine = smiles.replace("[N-]", "[NH]")
            amine = amine.replace("[n-]", "[nH]")
            for salt in [".[Cl-]", ".[H+]", "[H+].", "[Cl-].", "H+", "H2+", "H3+"]: #clear salt and final neutralize
                amine = amine.replace(salt, "") 
                amine = amine.replace("[N]", "N") #clean
                amine = amine.replace("[n]", "n")
            amine = check_name(amine)
            if amine == None:
                neutral_file.writerow([row.values(), smiles, amine]) 
            #amine check
            lower = smiles.lower()
            alpha = ''.join(x for x in lower if x.isalpha())
            for i in alpha:
                if i!="n" and i!="h" and i!="c":
                    amines_file.writerow([row.values(), smiles]) 
            #canonicalize check
            mol = Chem.MolFromSmiles(smiles) 
            if mol==None:
                rdkit_file.writerow([row.values(), smiles])
            #cactus (part 2) check
            else:
                rd = Chem.MolToSmiles(mol)
                check = check_name(rd)
                if check == None:
                    cactus_file.writerow([row.values(), smiles, rd])
    fh.close()
    oh.close()
    ok.close()
    am.close()
    er.close()
    ne.close()
    ct.close()
    
error_files("Amines_oxides.tsv")